// 认证中间件
const expressModule = require('../zh/后端/Express');

/**
 * 认证中间件 - 检查用户是否已登录
 * @param {Object} 请求 - Express请求对象
 * @param {Object} 响应 - Express响应对象
 * @param {Function} 下一个 - 下一个中间件函数
 */
function 认证检查(请求, 响应, 下一个) {
  try {
    // 从Session中获取用户信息
    const 用户 = expressModule.获取Session数据(请求, 'user');
    
    // 如果用户未登录
    if (!用户 || !用户.id || !用户.用户名) {
      expressModule.设置状态码(响应, 401);
      return expressModule.发送JSON(响应, {
        success: false,
        message: '未授权访问，请先登录',
        code: 'UNAUTHORIZED'
      });
    }
    
    // 将用户信息附加到请求对象上，便于后续使用
    请求.当前用户 = 用户;
    
    // 继续处理请求
    下一个();
  } catch (错误) {
    console.error('认证中间件错误:', 错误);
    expressModule.设置状态码(响应, 500);
    expressModule.发送JSON(响应, {
      success: false,
      message: '认证过程中发生错误',
      code: 'AUTH_ERROR'
    });
  }
}

/**
 * 角色检查中间件 - 验证用户是否具有特定角色
 * @param {Array|string} 允许的角色 - 允许访问的角色列表
 * @returns {Function} 中间件函数
 */
function 角色检查(允许的角色) {
  // 确保允许的角色是数组
  const 允许角色列表 = Array.isArray(允许的角色) ? 允许的角色 : [允许的角色];
  
  return function(请求, 响应, 下一个) {
    try {
      // 首先检查用户是否已认证
      if (!请求.当前用户) {
        expressModule.设置状态码(响应, 401);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '未授权访问，请先登录',
          code: 'UNAUTHORIZED'
        });
      }
      
      // 检查用户角色是否在允许列表中
      const 用户角色 = 请求.当前用户.角色 || '用户';
      
      if (!允许角色列表.includes(用户角色)) {
        expressModule.设置状态码(响应, 403);
        return expressModule.发送JSON(响应, {
          success: false,
          message: '权限不足，无法访问此资源',
          code: 'FORBIDDEN'
        });
      }
      
      // 角色验证通过，继续处理请求
      下一个();
    } catch (错误) {
      console.error('角色检查中间件错误:', 错误);
      expressModule.设置状态码(响应, 500);
      expressModule.发送JSON(响应, {
        success: false,
        message: '权限检查过程中发生错误',
        code: 'PERMISSION_ERROR'
      });
    }
  };
}

/**
 * 可选认证中间件 - 尝试获取用户信息但不强制要求登录
 * @param {Object} 请求 - Express请求对象
 * @param {Object} 响应 - Express响应对象
 * @param {Function} 下一个 - 下一个中间件函数
 */
function 可选认证(请求, 响应, 下一个) {
  try {
    // 尝试从Session中获取用户信息
    const 用户 = expressModule.获取Session数据(请求, 'user');
    
    // 如果用户已登录，将用户信息附加到请求对象
    if (用户 && 用户.id && 用户.用户名) {
      请求.当前用户 = 用户;
    }
    
    // 无论是否登录，都继续处理请求
    下一个();
  } catch (错误) {
    console.error('可选认证中间件错误:', 错误);
    // 出错时也继续处理请求
    下一个();
  }
}

module.exports = {
  认证检查,
  角色检查,
  可选认证
};